补充:
我们知道静态库的目的是对功能的封装,静态库中的函数是要通过静态链接器跟工程源码链接在一起形成最终的可执行文件。而动态链接库的向我们的应用提供了一种调用外部代码的方式,使得我们的应用在链接的时候只需要“接入”动态链接库的地址而非源码,这样减小了可执行文件的体积。但是由于苹果的沙箱机制,iOS App无法直接调用除系统之外的沙箱外部的代码,所以我们在XCode中虽然创建的是动态库,实际上是静态库的效果。Framework帮我们将头文件、可执行文件、资源文件等封装在了一起,是苹果推荐的方式。
什么是静态库 Static Library
所谓静态库或者说是 .a
文件,就是一系列从源码编译的目标文件的集合。它是源码的实现对应的二进制。在最后编译app的时候 .a
将被链接到最终的可执行文件中,之后每次都随着app 的可执行二进制文件一同加载,你不能控制加载的方式和时机。
什么是动态框架 Dynamic Framework
Framework
其实是一个bundle, 或者说是一个特殊的文件夹。系统的是存在于系统内部,而不会打包进app中。app启动是会检查所需要的动态框架是否已经加载。像UIKit
之类的系统框架一般已经在内存中,不需要再次加载,这可以保证app启动速度。Framework
是自包含的,你不需要关心头文件位置等。
Library vs Framework
Framework
有很多好处,比如它可以将资源文件(xib,image)包含在自己的bundle中,而Library
不能包含,只能将这些文件单独拉进app的main bundle中才能使用,维护较困难。
动态框架加载到内存后不需要再次加载二次启动速度加快。
Cocoa Touch Framework
iOS 8后苹果允许开发者有条件的创建和使用动态框架,这种框架叫Cocoa Touch Framework。
虽然同样是动态的,但是和系统的Framework不同,app中使用CTF在打包和提交app时会被放到app bundle中,运行在沙盒里,而不是系统中。也就是说不同的app使用了同样的Framework会被分别签名,打包和加载
CTF的推出为了解决两个问题: 一是为了ios8 之后的扩展开发 而是因为Swift在开源之前是不支持编译为静态库的。
包和依赖管理
现在使用最广泛的应该是CocoaPods,它是一个ruby程序。
CocoaPods 的主要原理是框架的提供者通过编写合适的PodSpec 文件来提供框架的基本信息,包括仓库地址,需要编译的文件,依赖等 用户使用 Podfile 文件指定想要使用的框架,CocoaPods 会创建一个新的工程来管理这些框架和它们的依赖,并把所有这些框架编译到成一个静态的 libPod.a。然后新建一个 workspace 包含你原来的项目和这个新的框架项目,最后在原来的项目中使用这个libPods.a
因为现在Swfit的代码只能被编译为动态框架,所以使用的依赖中包含swift代码,又想使用CocoaPods来管理的话必须在Podfile中添加 user_framework!
来编译Cocoa Touch Framework
创建框架
API设计
在 API 设计的时候,从原则上来说,我们一开始可以提供尽可能少的接口来完成必要的任务,这有助于在框架初期控制框架的复杂程度。 之后随着逐步的开发和框架使用场景的扩展,我们可以添加公共接口或者将原来的 internal 或者 private 接口标记为 public 供外界使用。另外需要注意方法名应该是动词或者动词短语开头,而属性名应该是名词
关于 API 的命名,Apple 官方给出了一个很详细的指南(Swift API Design Guidelines),相信每个开发者的必读内容